package com.ruoyi.employee.service.impl;

import java.util.List;
import java.util.Map;
import java.util.HashMap;

import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.employee.domain.HrPersonChangeView;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.employee.mapper.HrPersonChangeMapper;
import com.ruoyi.employee.domain.HrPersonChange;
import com.ruoyi.employee.service.IHrPersonChangeService;

/**
 * 人员变动记录Service业务层处理
 * author hango
 * date 2025-10-19
 */
@Service
public class HrPersonChangeServiceImpl implements IHrPersonChangeService
{
    @Autowired
    private HrPersonChangeMapper hrPersonChangeMapper;

    /**
     * 查询人员变动记录
     *
     * @param id 人员变动记录主键
     * @return 人员变动记录
     */
    @Override
    public HrPersonChange selectHrPersonChangeById(String id)
    {
        return hrPersonChangeMapper.selectHrPersonChangeById(id);
    }

    /**
     * 查询人员变动记录列表
     *
     * @param hrPersonChange 人员变动记录
     * @return 人员变动记录
     */
    @Override
    public List<HrPersonChange> selectHrPersonChangeList(HrPersonChange hrPersonChange)
    {
        return hrPersonChangeMapper.selectHrPersonChangeList(hrPersonChange);
    }

    /**
     * 新增人员变动记录
     *
     * @param hrPersonChange 人员变动记录
     * @return 结果
     */
    @Override
    public int insertHrPersonChange(HrPersonChange hrPersonChange)
    {
        hrPersonChange.setCreateTime(DateUtils.getNowDate());
        return hrPersonChangeMapper.insertHrPersonChange(hrPersonChange);
    }

    /**
     * 修改人员变动记录
     *
     * @param hrPersonChange 人员变动记录
     * @return 结果
     */
    @Override
    public int updateHrPersonChange(HrPersonChange hrPersonChange)
    {
        hrPersonChange.setUpdateTime(DateUtils.getNowDate());
        return hrPersonChangeMapper.updateHrPersonChange(hrPersonChange);
    }

    /**
     * 批量删除人员变动记录
     *
     * @param ids 需要删除的人员变动记录主键
     * @return 结果
     */
    @Override
    public int deleteHrPersonChangeByIds(String[] ids)
    {
        return hrPersonChangeMapper.deleteHrPersonChangeByIds(ids);
    }

    /**
     * 删除人员变动记录信息
     *
     * @param id 人员变动记录主键
     * @return 结果
     */
    @Override
    public int deleteHrPersonChangeById(String id)
    {
        return hrPersonChangeMapper.deleteHrPersonChangeById(id);
    }


    /**
     * 查询人员变动记录列表（视图）
     * 说明：从 vw_hr_person_change 视图查询，返回带部门/岗位/职级名称与可读文案。
     *
     * @param empId  员工ID（可空）
     * @param params 额外参数（支持 params.beginTime / params.endTime，可空）
     * @return 结果集（Map 形式，字段与视图列一致，如 fromPostName/toPostName/opContentGen 等）
     */
    @Override
    public List<Map<String, Object>> selectFromView(String empId, Map<String, Object> params)
    {
        // empId 为空串容错 -> 置为 null
        String safeEmpId = isBlank(empId) ? null : empId;

        // 归一化筛选参数（避免空串、仅日期无时间的问题）
        Map<String, Object> safeParams = normalizeParams(params);

        return hrPersonChangeMapper.selectFromView(safeEmpId, safeParams);
    }

    /**
     * 查询人员变动记录详情（视图）
     * 说明：从 vw_hr_person_change 视图按主键查询单条记录。
     *
     * @param id 人员变动记录主键
     * @return 结果（Map 形式，字段与视图列一致）
     */
    @Override
    public Map<String, Object> selectOneFromView(String id)
    {
        return hrPersonChangeMapper.selectOneFromView(id);
    }


    /** 判空（null 或 全空白） */
    private boolean isBlank(String s) {
        return s == null || s.trim().isEmpty();
    }

    public List<HrPersonChangeView> selectHrPersonChangeViewList(HrPersonChange query)
    {
        // 仅日期自动补时间（可选，便于前端直接传 yyyy-MM-dd）
        if (query != null && query.getParams() != null) {
            Object bt = query.getParams().get("beginTime");
            Object et = query.getParams().get("endTime");
            if (bt instanceof String && ((String) bt).matches("^\\d{4}-\\d{2}-\\d{2}$")) {
                query.getParams().put("beginTime", bt + " 00:00:00");
            }
            if (et instanceof String && ((String) et).matches("^\\d{4}-\\d{2}-\\d{2}$")) {
                query.getParams().put("endTime", et + " 23:59:59");
            }
        }
        return hrPersonChangeMapper.selectHrPersonChangeViewList(query);
    }

    /**
     * 归一化 params：
     * - 将空串转为 null；
     * - 若 beginTime / endTime 仅为 yyyy-MM-dd，则补全到 00:00:00 / 23:59:59；
     */
    private Map<String, Object> normalizeParams(Map<String, Object> params) {
        Map<String, Object> safe = (params == null) ? new HashMap<>() : new HashMap<>(params);

        Object bt = safe.get("beginTime");
        Object et = safe.get("endTime");

        String beginTime = (bt == null) ? null : bt.toString().trim();
        String endTime   = (et == null) ? null : et.toString().trim();

        // 空串转 null
        if (isBlank(beginTime)) beginTime = null;
        if (isBlank(endTime))   endTime = null;

        // 仅日期自动补时间
        if (beginTime != null && beginTime.matches("^\\d{4}-\\d{2}-\\d{2}$")) {
            beginTime = beginTime + " 00:00:00";
        }
        if (endTime != null && endTime.matches("^\\d{4}-\\d{2}-\\d{2}$")) {
            endTime = endTime + " 23:59:59";
        }

        // 回填
        if (beginTime == null) safe.remove("beginTime"); else safe.put("beginTime", beginTime);
        if (endTime == null)   safe.remove("endTime");   else safe.put("endTime",   endTime);

        return safe;
    }
}
